/**
 * 前端片段类型定义
 * 对应后端的片段类型系统，包含BaseSegment、MediaSegment、VisualSegment等
 */

// 导入通用元数据和基础类型
import type {
    Timerange,
    Speed,
    KeyframeList,
    ClipSettings,
    EffectMeta,
    TextStyle,
    TextBorder,
    TextBackground,
    TextShadow,
    TextBubble,
    TextEffect,
    AudioFade,
    AudioEffect,
    AudioMaterial,
    VideoEffect,
    Filter,
    SegmentAnimations,
} from '../../meta/types';

// ==================== 片段基础类型定义 ====================

/**
 * 片段基类，所有片段类型的基础接口
 */
export interface BaseSegment {
    /** 片段的全局唯一标识符 */
    segment_id: string;
    /** 关联的素材ID */
    material_id: string;
    /** 片段在时间轴上的目标时间范围 */
    target_timerange: Timerange;
    /** 通用关键帧列表 */
    common_keyframes: KeyframeList[];
}

/**
 * 媒体片段基类，包含音视频共有的属性
 */
export interface MediaSegment extends BaseSegment {
    /** 素材的源时间范围（可选，用于裁剪） */
    source_timerange?: Timerange;
    /** 播放速度设置 */
    speed: Speed;
    /** 音量大小，0-1 */
    volume: number;
    /** 是否变调 */
    change_pitch: boolean;
    /** 额外关联的素材引用列表 */
    extra_material_refs: string[];
}

/**
 * 视觉片段基类，包含视频、文字、贴纸等可视化元素的共有属性
 */
export interface VisualSegment extends MediaSegment {
    /** 图像调节设置 */
    clip_settings: ClipSettings;
    /** 是否等比缩放 */
    uniform_scale: boolean;
    /** 动画实例（可选） */
    animations_instance?: SegmentAnimations;
}

// ==================== 具体片段类型定义 ====================

/**
 * 视频片段
 */
export interface VideoSegment extends VisualSegment {
    /** 片段类型标识 */
    type: 'video';
    /** 视频文件路径 */
    src: string;
    /** 视频名称 */
    name: string;
    /** 缩略图URL（可选） */
    thumbnail_url?: string;
    /** 原始视频时长 */
    original_duration: number;
    /** 视频分辨率 */
    resolution: {
        width: number;
        height: number;
    };
}

/**
 * 音频片段
 */
export interface AudioSegment extends MediaSegment {
    /** 片段类型标识 */
    type: 'audio';
    /** 音频素材实例 */
    material_instance: AudioMaterial;
    /** 淡入淡出效果（可选） */
    fade?: AudioFade;
    /** 音频特效列表 */
    effects: AudioEffect[];
}

/**
 * 文字片段
 */
export interface TextSegment extends VisualSegment {
    /** 片段类型标识 */
    type: 'text';
    /** 文字内容 */
    text: string;
    /** 字体设置（可选） */
    font?: EffectMeta;
    /** 文字样式 */
    style: TextStyle;
    /** 文字描边（可选） */
    border?: TextBorder;
    /** 文字背景（可选） */
    background?: TextBackground;
    /** 文字阴影（可选） */
    shadow?: TextShadow;
    /** 文字气泡（可选） */
    bubble?: TextBubble;
    /** 文字特效（可选） */
    effect?: TextEffect;
}

/**
 * 贴纸片段
 */
export interface StickerSegment extends VisualSegment {
    /** 片段类型标识 */
    type: 'sticker';
    /** 贴纸文件路径 */
    src: string;
    /** 贴纸名称 */
    name: string;
    /** 贴纸类型 */
    sticker_type: 'static' | 'animated' | 'interactive';
    /** 贴纸分类 */
    category: string;
    /** 是否为VIP贴纸 */
    is_vip: boolean;
}

/**
 * 特效片段
 */
export interface EffectSegment extends BaseSegment {
    /** 片段类型标识 */
    type: 'effect';
    /** 特效实例 */
    effect_inst: VideoEffect;
}

/**
 * 滤镜片段
 */
export interface FilterSegment extends BaseSegment {
    /** 片段类型标识 */
    type: 'filter';
    /** 滤镜素材 */
    material: Filter;
}

// ==================== 联合类型和工具类型 ====================

/**
 * 所有片段类型的联合类型
 */
export type AnySegment = VideoSegment | AudioSegment | TextSegment | StickerSegment | EffectSegment | FilterSegment;

/**
 * 片段类型字符串联合类型
 */
export type SegmentType = 'video' | 'audio' | 'text' | 'sticker' | 'effect' | 'filter';

/**
 * 根据片段类型获取对应的片段接口
 */
export type SegmentByType<T extends SegmentType> = T extends 'video'
    ? VideoSegment
    : T extends 'audio'
      ? AudioSegment
      : T extends 'text'
        ? TextSegment
        : T extends 'sticker'
          ? StickerSegment
          : T extends 'effect'
            ? EffectSegment
            : T extends 'filter'
              ? FilterSegment
              : never;

// ==================== 操作参数类型定义 ====================

/**
 * 创建片段的参数接口
 */
export interface CreateSegmentParams<T extends SegmentType> {
    /** 片段类型 */
    type: T;
    /** 素材ID */
    material_id: string;
    /** 目标时间范围 */
    target_timerange: Timerange;
    /** 其他可选参数 */
    [key: string]: any;
}

// ==================== API 请求参数类型定义 ====================

/**
 * 添加片段到轨道的请求参数
 */
export interface AddSegmentToTrackParams {
    /** 草稿ID */
    draft_id: string;
    /** 轨道ID */
    track_id: string;
    /** 片段类型 */
    segment_type: SegmentType;
    /** 开始时间（微秒），可选，默认为0 */
    start_time?: number;
    /** 持续时间（微秒），可选，默认为1秒 */
    duration?: number;
    /** 片段数据，根据不同片段类型包含不同的数据结构 */
    segment_data?: Partial<AnySegment>;
}

/**
 * 添加片段到轨道的响应数据
 */
export interface AddSegmentToTrackResponse {
    /** 操作是否成功 */
    success: boolean;
    /** 响应消息 */
    message: string;
    /** 创建的片段数据 */
    data?: AnySegment;
    /** 错误信息（如果有） */
    error?: string;
}

/**
 * 获取片段详情的响应数据
 */
export interface GetSegmentResponse {
    /** 操作是否成功 */
    success: boolean;
    /** 片段数据 */
    data?: AnySegment;
    /** 错误信息（如果有） */
    error?: string;
}

/**
 * 更新片段的请求参数
 */
export interface UpdateSegmentParams {
    /** 草稿ID */
    draft_id: string;
    /** 片段ID */
    segment_id: string;
    /** 要更新的片段数据 */
    segment_data: Partial<AnySegment>;
}

/**
 * 更新片段的响应数据
 */
export interface UpdateSegmentResponse {
    /** 操作是否成功 */
    success: boolean;
    /** 响应消息 */
    message: string;
    /** 更新后的片段数据 */
    data?: AnySegment;
    /** 错误信息（如果有） */
    error?: string;
}

/**
 * 删除片段的响应数据
 */
export interface DeleteSegmentResponse {
    /** 操作是否成功 */
    success: boolean;
    /** 响应消息 */
    message: string;
    /** 错误信息（如果有） */
    error?: string;
}

// ==================== 视频操作相关类型定义 ====================

/**
 * 视频操作类型
 */
export type VideoOperationType = 'animation' | 'filter' | 'effect' | 'keyframe' | 'mask' | 'transition' | 'background_filling';

/**
 * 动画操作参数
 */
export interface AnimationOperationParams {
    /** 动画类型 */
    animation_type: string;
    /** 动画分类 */
    animation_category: string;
    /** 动画持续时间 */
    duration: string;
}

/**
 * 滤镜操作参数
 */
export interface FilterOperationParams {
    /** 滤镜类型 */
    filter_type: string;
    /** 滤镜参数 */
    filter_params: Record<string, any>;
}

/**
 * 特效操作参数
 */
export interface EffectOperationParams {
    /** 特效类型 */
    effect_type: string;
    /** 特效参数 */
    effect_params: Record<string, any>;
}

/**
 * 关键帧操作参数
 */
export interface KeyframeOperationParams {
    /** 关键帧类型 */
    keyframe_type: string;
    /** 关键帧参数 */
    keyframe_params: Record<string, any>;
}

/**
 * 蒙版操作参数
 */
export interface MaskOperationParams {
    /** 蒙版类型 */
    mask_type: string;
    /** 蒙版参数 */
    mask_params: Record<string, any>;
}

/**
 * 转场操作参数
 */
export interface TransitionOperationParams {
    /** 转场类型 */
    transition_type: string;
    /** 转场参数 */
    transition_params: Record<string, any>;
}

/**
 * 背景填充操作参数
 */
export interface BackgroundFillingOperationParams {
    /** 背景填充类型 */
    background_type: string;
    /** 背景填充参数 */
    background_params: Record<string, any>;
}

/**
 * 视频操作参数联合类型
 */
export type VideoOperationParams = 
    | AnimationOperationParams
    | FilterOperationParams
    | EffectOperationParams
    | KeyframeOperationParams
    | MaskOperationParams
    | TransitionOperationParams
    | BackgroundFillingOperationParams;

/**
 * 视频操作项
 */
export interface VideoOperation {
    /** 操作类型 */
    operation_type: VideoOperationType;
    /** 操作参数 */
    params: VideoOperationParams;
}

/**
 * 添加视频操作的请求参数
 */
export interface AddVideoOperationsParams {
    /** 草稿ID */
    draft_id: string;
    /** 轨道ID */
    track_id: string;
    /** 片段ID */
    segment_id: string;
    /** 操作列表 */
    operations: VideoOperation[];
}

/**
 * 添加视频操作的响应数据
 */
export interface AddVideoOperationsResponse {
    /** 操作是否成功 */
    success: boolean;
    /** 响应消息 */
    message: string;
    /** 响应数据 */
    data: {
        /** 轨道ID */
        track_id: string;
        /** 片段ID */
        segment_id: string;
        /** 片段索引 */
        segment_index: number;
        /** 操作动作 */
        action: string;
        /** 操作消息 */
        message: string;
        /** 总操作数量 */
        total_operations: number;
        /** 操作列表 */
        operations: VideoOperation[];
        /** 处理过程 */
        process: string;
    };
}